home *** CD-ROM | disk | FTP | other *** search
- /*
- * Example of server using TCP protocol.
- */
-
- #include "inet.h"
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int tfd, newtfd, clilen, childpid;
- struct sockaddr_in cli_addr, serv_addr;
- struct t_bind req;
- struct t_call *callptr;
-
- pname = argv[0];
-
- /*
- * Create a TCP transport endpoint.
- */
-
- if ( (tfd = t_open(DEV_TCP, O_RDWR, (struct t_info *) 0)) < 0)
- err_dump("server: can't t_open %s", DEV_TCP);
-
- /*
- * Bind our local address so that the client can send to us.
- */
-
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- serv_addr.sin_port = htons(SERV_TCP_PORT);
-
- req.addr.maxlen = sizeof(serv_addr);
- req.addr.len = sizeof(serv_addr);
- req.addr.buf = (char *) &serv_addr;
- req.qlen = 5;
-
- if (t_bind(tfd, &req, (struct t_bind *) 0) < 0)
- err_dump("server: can't t_bind local address");
-
- /*
- * Allocate a t_call structure for t_listen() and t_accept().
- */
-
- if ( (callptr = (struct t_call *) t_alloc(tfd, T_CALL, T_ADDR)) == NULL)
- err_dump("server: t_alloc error for T_CALL");
-
- for ( ; ; ) {
- /*
- * Wait for a connection from a client process.
- * This is an example of a concurrent server.
- */
-
- if (t_listen(tfd, callptr) < 0)
- err_dump("server: t_listen error");
-
- if ( (newtfd = accept_call(tfd, callptr, DEV_TCP, 1)) < 0)
- err_dump("server: accept_call error");
-
- if ( (childpid = fork()) < 0)
- err_dump("server: fork error");
-
- else if (childpid == 0) { /* child process */
- t_close(tfd); /* close original endpoint */
- str_echo(newtfd); /* process the request */
- exit(0);
- }
-
- close(newtfd); /* parent process */
- }
- }
-